/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.commons.pool2;

/**
 * PooledObjectState 是一个表示对象池中的对象状态的枚举类型
 */
public enum PooledObjectState {

    /**
     * 空闲
     * 1、表示对象池中的对象处于空闲状态.
     * 2、在对象池中，空闲状态表示该对象没有被使用，也没有被其他线程占用
     * 3、当有线程需要使用对象时，如果对象处于空闲状态，那么就可以将其分配给该线程使用；否则，该线程需要等待直到对象变为空闲状态。
     */
    IDLE,

    /**
     * 在使用
     * 1、表示对象池中的对象已经被分配给某个线程使用
     * 2、在对象池中，分配状态表示该对象已经被分配给某个线程使用，并且该线程正在使用该对象。
     * 3、当该线程完成对对象的使用后，可以将对象归还到对象池中，以便其他线程可以使用。
     */
    ALLOCATED,

    /**
     * 位于队列中，当前正在测试，可能会被回收
     * 1、表示对象池中的对象正在被移除。
     * 2、在对象池中，驱逐状态表示该对象已经被从对象池中移除，并且不再可用。
     * 3、这可能是因为对象池达到了最大容量限制，或者因为其他线程已经将对象归还到对象池中。
     */
    EVICTION,

    /**
     * 不在队列中，当前正在测试，可能会被回收。从池中借出对象时需要从队列出移除并进行测试
     */
    EVICTION_RETURN_TO_HEAD,

    /**
     * In the queue, currently being validated.
     * 1、表示对象池中的对象正在被验证
     * 2、在对象池中，验证状态通常用于确保对象的状态符合预期，例如检查对象是否已经被正确初始化或释放资源等。
     * 3、如果对象通过了验证，那么它将被视为有效并可以被线程使用；否则，该对象将被标记为无效，并且可能被移除或替换。
     */
    VALIDATION,

    /**
     * 不在队列中，当前正在验证。当对象从池中被借出，在配置了testOnBorrow的情况下，对像从队列移除和进行预分配的时候会进行验证
     */
    VALIDATION_PREALLOCATED,

    /**
     * 不在队列中，正在进行验证。从池中借出对象时，从队列移除对象时会先进行测试。返回到队列头部的时候应该做一次完整的验证
     */
    VALIDATION_RETURN_TO_HEAD,

    /**
     * 回收或验证失败，将销毁
     * 1、表示对象池中的对象无效
     * 2、在对象池中，无效状态通常用于表示该对象已经被标记为不可用或已被移除。
     * 3、如果对象处于无效状态，那么它将无法被线程使用，并且可能被其他线程重新分配给其他任务。
     */
    INVALID,

    /**
     * 即将无效
     * 1、表示对象池中的对象被放弃
     * 2、在对象池中，放弃状态通常用于表示该对象已经被标记为不可用或已被移除，并且没有被其他线程重新分配给其他任务。
     * 3、如果对象处于放弃状态，那么它将无法被线程使用，并且可能被其他线程重新分配给其他任务。
     */
    ABANDONED,

    /**
     * 返还到池中
     * 1、表示对象池中的对象正在被返回到对象池中
     * 2、在对象池中，返回状态通常用于表示该对象已经被标记为可用，并且可以被其他线程重新分配给其他任务。
     * 3、如果对象处于返回状态，那么它将被放回到对象池中，以便其他线程可以使用。
     */
    RETURNING
}
